<?php

namespace App\Services\Idcard;

use App\Services\Idcard\Idcard;
use App\Services\Idcard\IdcardCountryAuthApi;
use App\Models\IdcardCountryAuth;
use App\Services\SdkService;
use App\Services\ServiceBase;
use Illuminate\Support\Facades\Http;
use YQ\YqCurl;

class IdcardAuthService extends ServiceBase
{
    /**
     * 身份证实名认证
     * 服务商:国家中宣部
     * https://wlc.nppa.gov.cn/fcm_company/index.html#/login
     * @param  string $idcard_name 姓名
     * @param  string $idcard      身份证
     * @param  string $biz_id      备案识别码 中宣部防沉迷系统上的识别码
     * @param  string $company     所属公司主体 用于寻找对应的配置参数
     * @return
     */
    public function checkByZhongxuanbu($idcard_name, $idcard, $biz_id = '', $company = '')
    {
        if ($biz_id === '') {
            return false;
        }

        $config = config("idcard.{$company}");
        $api    = new IdcardCountryAuthApi($config['app_id'], $config['app_secret'], $biz_id);
        $ret    = $api->check($idcard_name, $idcard);
        if ($ret === false) {
            return false;
        }

        // 只要成功的，其他失败、认证中都不需要
        if ($ret['result']['status'] !== IdcardCountryAuth::STATUS_SUCCESS) {
            return false;
        }

        return $ret;
    }

    /**
     * 身份证实名认证-身份证二要素-身份证一致性验证
     * 服务商:四川涪擎大数据技术有限公司
     * https://market.aliyun.com/products/57000002/cmapi022049.html
     * @param  string $idcard      身份证
     * @param  string $idcard_name 姓名
     * @return
     */
    public function checkByFuqing($idcard_name, $idcard)
    {
        $appkey     = 'cx0uobxjbr4dgpd90obp0sbfynu5qs9c';
        $appcode    = '329d28a956814cc4860df9d9e510156d';
        $verify_key = 'IVwmgsHmrzRsCv';
        $url        = "https://idcert.market.alicloudapi.com/idcard";
        $headers    = [];
        array_push($headers, "Authorization:APPCODE " . $appcode);

        $params = [
            'idCard' => $idcard,
            'name'   => $idcard_name,
        ];

        $res = YqCurl::curl($url, $params, 0, 1, 5, false, $headers);
        $res = json_decode($res, true);
        if ($res['status'] == '01') {
            return true;
        }

        //状态为202-库无
        // 您好，出现'无法验证'时，表示‘库无’，原因如下：
        //    (1) 现役军人，刚退役不到2年的军人（一般为2年）、特殊部门人员；
        //    (2) 身份真实，大学生户口迁移；
        //    (3) 户口迁出，且没有在新的迁入地迁入；
        //    (4) 户口迁入新迁入地，当地公安系统未上报到公安部（上报时间有地域差异）；
        //    (5) 更改姓名，当地公安系统未上报到公安部（上报时间有地域差异）；
        //    (6) 身份真实，但是逾期未办理；
        //    (7) 身份真实，未更换二代身份证；
        //    (8) 移民和死亡；
        //    (9) 身份证号确实不存在。
        yqlog($url, $headers, $params, $res);
        return false;
    }

    public function checkByXipin($idcard_name, $idcard)
    {
        $params = [
            'idcard' => $idcard,
            'name' => $idcard_name,
        ];
        $params['sign'] = SdkService::getInstance()->createSign($params);

        $url = 'https://xipin-sdk-server.xipin.top/api/sys/idcard_check';
        $response = Http::post($url, $params);
        $res = json_decode($response->body(), true);
        $status = $res['data']['check_status'] ?? 0;
        if ($status < 1) {
            return false;
        }

        return true;
    }

    public function check($idcard_name, $idcard, $biz_id = 0, $company = '', $other_check = false)
    {
        // 获取身份证基本信息，其中包括了对其身份证号码的格式校验
        $info = $this->getIdCardInfo($idcard);
        if (!$info) {
            return false;
        }

        // 先在自己的库验证
        $mod = IdcardCountryAuth::where('idcard', $idcard)->where('biz_id', $biz_id)->first();
        if ($mod) {
            return $mod->name == $idcard_name ? true : false;
        }

        // 使用xipin认证
        $check_source = 'xp';
        $pi = '';
        $res = $this->checkByXipin($idcard_name, $idcard);
        if ($res === false) {
            return false;
        }

        $mod               = new IdcardCountryAuth;
        $mod->create_time  = time();
        $mod->biz_id       = $biz_id;
        $mod->idcard       = $idcard;
        $mod->name         = $idcard_name;
        $mod->pi           = $pi;
        $mod->check_source = $check_source;
        $mod->save();

        return true;
    }

    /**
     * 返回身份证相关信息 ['idcard'=>'身份证','birthday'=>'1990-05-27','age'=>'27','gender'=>'男','region'=>'广东省 广州市 天河区']
     * @param string $idcard
     * @return array|bool 返回false，标识身份证验证不通过,通过返回数组
     */
    public function getIdCardInfo($idcard)
    {
        $idcard_class = Idcard::getInstance($idcard);

        // 检查身份证格式
        if (!$idcard_class->check()) {
            return false;
        }

        return [
            'idcard'   => $idcard,
            'birthday' => $idcard_class->getBirthday(),
            'age'      => $idcard_class->getAge(),
            'gender'   => $idcard_class->getGender(),
            'region'   => $idcard_class->getRegion(),
        ];
    }
}
